<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 对象的创建方法
        // 1.var obj = {}       plainObject -- > 对象字面量/对象直接量

        // 2.构造函数
        //       1）系统自带构造函数   new Object();  Arraay();Number();Boolean();String();Date();
        //       2）自定义
        // function Car(color) {
        //     this.color = color;
        //     this.name = 'BMW';
        //     this.height = '1400';
        //     this.lang = '4900';
        //     this.weight = 1000;
        //     this.health = 100;
        //     this.run = function() {
        //         this.health--;
        //     }
        // }

        // var car = new Car('red');
        // var car1 = new Car('black');
        // car.name = 'Maserati';
        // car1.name = 'Merz';



        // function Student(name, age) {
        //     this.name = name;
        //     this.age = age;
        // }
        // var student = new Student('huang', 20);
        // console.log(student.name);


        // Object.create(原型)方法   可以创建对象
        // var obj = {
        //     name: 'sunny',
        //     age: 123
        // };
        // var obj1 = Object.create(obj);



        // 构造函数内部原理
        // 1.在函数体最前面隐式的加上this = {}
        // 2.执行this.xxx = xxx;
        // 3.隐式的返回this    有new了就不可能返回原始值



        // //包装类 
        // new String();  new Boolean();  new Number();
        // 值（数据）分为两类->原始值和引用值
        // 内部机制：原始值没有属性，但通过字符串原始值访问属性的话，不会报错，会新建一个new String()对象
        // 写的是String.length执行的是new String().length
        // var str = 'abcd';
        // str.length = 2;
        // console.log(str.length);
        // //生成一个新的对象     new String('abcd').length = 2; delete
        // console.log(str);


        // 小练习
        // var str = 'abc';
        // str += 1;
        // var test = typeof(str); //这个返回String
        // if (test.length == 6) {
        //     test.sign = 'typeof的返回结果可能为String';
        //     // new String(test).sign = 'xxx';原始值赋属性值需要调用包装类
        // }
        // // new String(test).sign  结果是啥都没有
        // console.log(test.sign); //undefined



        // 分析下面的Javascript代码段：
        // function employee(name, code) {
        //     this.name = 'wangli';
        //     this.code = 'A001';
        // }
        // var newemp = new employee('zhangming', 'A002');
        // console.log('雇员姓名：' + newemp.name);
        // console.log('雇员代号：' + newemp.code);
        // 输出的结果是()

        // A.雇员姓名： wangli 雇员代码： A001
        // B.雇员姓名： zhangming 雇员代码： A002
        // C.雇员姓名： null, 雇员代码： null
        // D.代码有误， 无输出结果



        // 运行test() 和 new test()的结果分别是什么
        // var a = 5;

        // function test() {
        //     a = 0;
        //     console.log(a);
        //     console.log(this.a);//5 / undefined
        //     var a;
        //     console.log(a);
        // }





        // function Person(name, age, sex) {
        //     var a = 0;
        //     this.name = name;
        //     this.age = age;
        //     this.sex = sex;

        //     function sss() {
        //         a++;
        //         console.log(a);
        //     }
        //     this.say = sss;
        // }

        // var oPerson = new Person();
        // oPerson.say();
        // oPerson.say();
        // var oPerson1 = new Person();
        // oPerson1.say();



        // 改成可以输出0-9的形式
        // function bb() {
        //     var arr = [];
        //     for (var i = 0; i < 10; i++) {
        //         arr[i] = function() {
        //             console.log(i);
        //         }
        //     }
        //     return arr;
        // }

        // var arr1 = bb();
        // for (var i = 0; i < 10; i++) {
        //     arr1[i]();
        // }




        // 下面这段js代码执行完毕后x,y,z的值分别是多少？

        // var x = 1,
        //     y = z = 0;

        // function add(n) {
        //     return n = n + 1;
        // }

        // y = add(x);

        // function add(n) {
        //     return n = n + 3; //执行顺序     第二个函数提升上去覆盖掉第一个函数
        // }
        // z = add(x);



        //          构造函数内部原理
        // 1. 在函数体的最前面隐式的加上this = {}
        // 2. 执行 this.xxx = xxx;
        // 3. 隐式的返回this




        // 求输出结果
        // function b(x, y, a) {
        //     arguments[2] = 10;
        //     console.log(a);
        // }
        // b(1, 2, 3);
        // 如果函数体改成下面，结果又会是什么？
        // a = 10;
        // console.log(arguments[2]);



        // 写一个方法，求一个字符串的长度。
        // （字符串有一个方法charCodeAt();）一个中文占两个字节，一个英文占一个字节
        // charCodeAt()方法可返回指定位置的字符的Unicode编码。
        // 这个返回值是0.65535之间的整数。
        // 当返回值是<=255时，为英文，当返回值>255时为中文
        // function retByteslen(target) {
        //     var count = 0;
        //     for (var i = 0; i < target.length; i++) {
        //         if (target.charCodeAt(i) <= 255) {
        //             count++;
        //         } else if (target.charCodeAt(i) > 255) {
        //             count += 2;
        //         }
        //     }
        //     console.log(count);
        // }
        // retByteslen('safygheuighuyhjis哈哈哈');
        // 简化后
        // function retByteslen(target) {
        //     var count,
        //           len;
        //     count = len = target.length;
        //     for (var i = 0; i < len; i++) {
        //         if (target.charCodeAt(i) > 255) {
        //             count++;
        //         }
        //     }
        //     console.log(count);
        // }
        // retByteslen('haha 哈哈');
    </script>
</body>

</html>